package com.kk.demo.java8.stream.base01.collectorimp;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;

/**
 * 并发容量操作
 * 
 * T 元素信息
 * 
 * A 输入容器信息
 * 
 * R 输出容器信息
 * 
 * @author liujun
 * @date 2016年8月30日
 * @verion 0.0.1
 * @param <T>
 * @param <A>
 * @param <R>
 */
public class SelfCollectorImpl implements Collector<String, Map<Integer, List<Integer>>, Map<Integer, List<Integer>>> {

    public SelfCollectorImpl() {
    }

    /**
     * 就是生成容器
     */
    public Supplier<Map<Integer, List<Integer>>> supplier() {
        return HashMap<Integer, List<Integer>>::new;
    }

    /**
     * 是往A容器添加元素T
     */
    public BiConsumer<Map<Integer, List<Integer>>, String> accumulator() {
        return (Map<Integer, List<Integer>> map, String key) -> {
            String[] array = key.split(",");

            int putKey = Integer.parseInt(array[0]);

            List<Integer> list = map.get(putKey);

            if (list != null) {
                list = new ArrayList<>();
            }

            list.add(Integer.parseInt(array[1]));

            map.put(putKey, list);
        };
    }

    /**
     * 合并容器
     */
    public BinaryOperator<Map<Integer, List<Integer>>> combiner() {
        return (Map<Integer, List<Integer>> a, Map<Integer, List<Integer>> b) -> {
            if (null != a && null != b) {
                Iterator<Entry<Integer, List<Integer>>> iterReduce = b.entrySet().iterator();

                Entry<Integer, List<Integer>> entry = null;

                while (iterReduce.hasNext()) {
                    entry = iterReduce.next();

                    // 检查是否包含b中的key信息
                    if (a.containsKey(entry.getKey())) {
                        List<Integer> value = a.get(entry.getKey());

                        int valuecount = entry.getValue().get(0) + value.get(0);

                        value.clear();
                        value.add(valuecount);

                        a.put(entry.getKey(), value);
                    }
                    // 如果不包含，则新加入
                    else {
                        a.put(entry.getKey(), entry.getValue());
                    }
                }
            }

            return a;
        };
    }

    /**
     * 转换容器输出
     */
    public Function<Map<Integer, List<Integer>>, Map<Integer, List<Integer>>> finisher() {
        return null;
    }

    /**
     * （特性说明）
     */
    public Set<java.util.stream.Collector.Characteristics> characteristics() {
        return null;
    }

}
